home *** CD-ROM | disk | FTP | other *** search
- /* musicrexx.c
- Copyright (c) 1993 by Thomas E. Janzen
- All Rights Reserved
-
- THIS SOFTWARE IS FURNISHED FREE OF CHARGE FOR STUDY AND USE AND MAY
- BE COPIED ONLY FOR PERSONAL USE OR COMPLETELY AS OFFERED WITH NO
- CHANGES FOR FREE DISTRIBUTION. NO TITLE TO AND OWNERSHIP OF THE
- SOFTWARE IS HEREBY TRANSFERRED. THOMAS E. JANZEN ASSUMES NO
- RESPONSIBILITY FOR THE USE OR RELIABILITY OF THIS SOFTWARE.
-
- Thomas E. Janzen
- 208A Olde Derby Road
- Norwood, MA 02062-1761
- (617)769-7733
-
- ** FACILITY:
- **
- ** AlgoRhythms music improviser on Commodore (TM) Amiga (TM)
- ** compiled with SAS/C Amiga Compiler 6.50
- **
- ** ABSTRACT:
- **
- ** musicrexx.c support Arexx for AlgoRhythms.
- **
- ** AUTHORS: Thomas E. Janzen
- **
- ** CREATION DATE: 23-OCT-1993
- **
- ** MODIFICATION HISTORY:
- ** DATE NAME DESCRIPTION
- ** 1 JAN 94 TEJ New for V3.0
- **--
- */
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include <ctype.h>
- #include <devices/timer.h>
- #include <math.h>
- #include <clib/intuition_protos.h>
- #include <proto/exec.h>
- #include "arexx.h"
- #include "arexxsyslib.h"
- #include "musicrexx.h"
- #include "scales.h"
- #include "drawform.h"
- #include "window.h"
- #include "files.h"
- #include "pitchnames.h"
-
- #define DEFAULT_NAME "ALGORHYTHMS"
- #define REPLY_STR "AlgoRhythms Acknowledge"
- #define REPLY_LEN (sizeof(REPLY_STR))
- #define C_NAME_LEN 80
- #define C_MAX_TRIES 99
- #define CMD_STR_LEN 128
-
-
- #define BREAK_CHARS " \t"
- #define MAX_TOKEN_QTY (10)
- /*
- ** Tokens for the Arexx command language
- */
- #define M_MENU (0XF)
- #define M_ITEM (0XF0)
- #define M_SUBITEM (0XF00)
- #define M_SUBSUBITEM (0XF000)
-
- #define S_PROJECT "PROJECT"
- #define N_PROJECT (0X1)
- #define S_PLAY "PLAY"
- #define N_PLAY (0X10)
- #define S_STOP "STOP"
- #define N_STOP (0X20)
- #define S_CONTINUE "CONTINUE"
- #define N_CONTINUE (0X30)
- #define S_LOADFORM "LOADFORM"
- #define N_LOADFORM (0X40)
- #define S_SAVEFORM "SAVEFORM"
- #define N_SAVEFORM (0X50)
- #define S_RECORD "RECORD"
- #define N_RECORD (0X60)
- #define S_ON "ON"
- #define N_ON (0X100)
- #define S_OFF "OFF"
- #define N_OFF (0X200)
- #define S_ERASE "ERASE"
- #define N_ERASE (0X70)
- #define S_LOAD8SVX "LOAD8SVX"
- #define N_LOAD8SVX (0X80)
- #define S_SAVEMIDI "SAVEMIDI"
- #define N_SAVEMIDI (0X90)
- #define S_QUIT "QUIT"
- #define N_QUIT (0XA0)
- #define S_FORM "FORM"
- #define N_FORM (0X2)
- #define S_MAXVOICES "MAXVOICES"
- #define N_MAXVOICES (0X10)
- #define S_REDRAW "REDRAW"
- #define N_REDRAW (0X20)
- #define S_PULSE "PULSE"
- #define N_PULSE (0X30)
- #define S_DURATION "DURATION"
- #define N_DURATION (0X40)
- #define S_PITCH "PITCH"
- #define N_PITCH (0X50)
- #define S_MEAN "MEAN"
- #define N_MEAN (0X100)
- #define S_RANGE "RANGE"
- #define N_RANGE (0X200)
- #define S_PERIOD "PERIOD"
- #define N_PERIOD (0X1000)
- #define S_PHASE "PHASE"
- #define N_PHASE (0X2000)
- #define S_RANDOMIZE "RANDOMIZE"
- #define N_RANDOMIZE (0X300)
- #define S_RHYTHM "RHYTHM"
- #define N_RHYTHM (0X60)
- #define S_DYNAMIC "DYNAMIC"
- #define N_DYNAMIC (0X70)
- #define S_TEXTURE "TEXTURE"
- #define N_TEXTURE (0X80)
- #define S_NOTELENGTH "NOTELENGTH"
- #define N_NOTELENGTH (0X90)
- #define S_MAXIMUM "MAXIMUM"
- #define N_MAXIMUM (0X100)
- #define S_MINIMUM "MINIMUM"
- #define N_MINIMUM (0X200)
- #define S_SCALE "SCALE"
- #define N_SCALE (0X3)
- #define S_TRANSPOSE "TRANSPOSE"
- #define N_TRANSPOSE (0X0)
- #define S_PENTATONIC "PENTATONIC"
- #define N_PENTATONIC (0X10)
- #define S_SHORTPENTATONIC "SHORTPENTATONIC"
- #define N_SHORTPENTATONIC (0X20)
- #define S_HARMONIC "HARMONIC"
- #define N_HARMONIC (0X30)
- #define S_DIATONIC "DIATONIC"
- #define N_DIATONIC (0X40)
- #define S_HIRAJOSHI "HIRAJOSHI"
- #define N_HIRAJOSHI (0X50)
- #define S_KUMOIJOSHI "KUMOIJOSHI"
- #define N_KUMOIJOSHI (0X60)
- #define S_KOKINJOSHI "KOKINJOSHI"
- #define N_KOKINJOSHI (0X70)
- #define S_WHOLETONE "WHOLETONE"
- #define N_WHOLETONE (0X80)
- #define S_QUINTAL "QUINTAL"
- #define N_QUINTAL (0X90)
- #define S_MIN3MAJ2 "MIN3MAJ2"
- #define N_MIN3MAJ2 (0XA0)
- #define S_HARMONICMINOR "HARMONICMINOR"
- #define N_HARMONICMINOR (0XB0)
- #define S_HUNGARIANMINOR "HUNGARIANMINOR"
- #define N_HUNGARIANMINOR (0XC0)
- #define S_DIMINISHED "DIMINISHED"
- #define N_DIMINISHED (0XD0)
- #define S_MODE3 "MODE3"
- #define N_MODE3 (0XE0)
- #define S_MODE4 "MODE4"
- #define N_MODE4 (0XF0)
- #define S_MODE5 "MODE5"
- #define N_MODE5 (0X100)
- #define S_MODE6 "MODE6"
- #define N_MODE6 (0X110)
- #define S_MODE7 "MODE7"
- #define N_MODE7 (0X120)
- #define S_QUARTAL "QUARTAL"
- #define N_QUARTAL (0X130)
- #define S_MAJ3MIN2 "MAJ3MIN2"
- #define N_MAJ3MIN2 (0X140)
- #define S_CHROMATIC "CHROMATIC"
- #define N_CHROMATIC (0X150)
- #define S_VOICE "VOICE"
- #define N_VOICE (0X4)
- #define S_CHANNEL "CHANNEL"
- #define N_CHANNEL (0X10)
- #define S_LOWNOTE "LOWNOTE"
- #define N_LOWNOTE (0X20)
- #define S_HIGHNOTE "HIGHNOTE"
- #define N_HIGHNOTE (0X30)
- #define S_WALKING "WALKING"
- #define N_WALKING (0X40)
- #define S_RANDOM "RANDOM"
- #define N_RANDOM (0X50)
- #define S_AUDIO "AUDIO"
- #define N_AUDIO (0X60)
- #define S_MIDI "MIDI"
- #define N_MIDI (0X70)
-
- typedef struct token_struct TOKEN_TYPE;
- struct token_struct
- {
- char *token_str;
- int token_num;
- };
-
- #define C_TOKEN_QTY (61)
-
- static TOKEN_TYPE tokens[] =
- {{S_PROJECT, N_PROJECT},
- {S_PLAY, N_PLAY},
- {S_STOP, N_STOP},
- {S_CONTINUE, N_CONTINUE},
- {S_LOADFORM, N_LOADFORM},
- {S_SAVEFORM, N_SAVEFORM},
- {S_RECORD, N_RECORD},
- {S_ON, N_ON},
- {S_OFF, N_OFF},
- {S_ERASE, N_ERASE},
- {S_LOAD8SVX, N_LOAD8SVX},
- {S_SAVEMIDI, N_SAVEMIDI},
- {S_QUIT, N_QUIT},
- {S_FORM, N_FORM},
- {S_MAXVOICES, N_MAXVOICES},
- {S_REDRAW, N_REDRAW},
- {S_PULSE, N_PULSE},
- {S_DURATION, N_DURATION},
- {S_PITCH, N_PITCH},
- {S_MEAN, N_MEAN},
- {S_RANGE, N_RANGE},
- {S_PERIOD, N_PERIOD},
- {S_PHASE, N_PHASE},
- {S_RANDOMIZE, N_RANDOMIZE},
- {S_RHYTHM, N_RHYTHM},
- {S_DYNAMIC, N_DYNAMIC},
- {S_TEXTURE, N_TEXTURE},
- {S_NOTELENGTH, N_NOTELENGTH},
- {S_MAXIMUM, N_MAXIMUM},
- {S_MINIMUM, N_MINIMUM},
- {S_SCALE, N_SCALE},
- {S_TRANSPOSE, N_TRANSPOSE},
- {S_PENTATONIC, N_PENTATONIC},
- {S_SHORTPENTATONIC, N_SHORTPENTATONIC},
- {S_HARMONIC, N_HARMONIC},
- {S_DIATONIC, N_DIATONIC},
- {S_HIRAJOSHI, N_HIRAJOSHI},
- {S_KUMOIJOSHI, N_KUMOIJOSHI},
- {S_KOKINJOSHI, N_KOKINJOSHI},
- {S_WHOLETONE, N_WHOLETONE},
- {S_QUINTAL, N_QUINTAL},
- {S_MIN3MAJ2, N_MIN3MAJ2},
- {S_HARMONICMINOR, N_HARMONICMINOR},
- {S_HUNGARIANMINOR, N_HUNGARIANMINOR},
- {S_DIMINISHED, N_DIMINISHED},
- {S_MODE3, N_MODE3},
- {S_MODE4, N_MODE4},
- {S_MODE5, N_MODE5},
- {S_MODE6, N_MODE6},
- {S_MODE7, N_MODE7},
- {S_QUARTAL, N_QUARTAL},
- {S_MAJ3MIN2, N_MAJ3MIN2},
- {S_CHROMATIC, N_CHROMATIC},
- {S_VOICE, N_VOICE},
- {S_CHANNEL, N_CHANNEL},
- {S_LOWNOTE, N_LOWNOTE},
- {S_HIGHNOTE, N_HIGHNOTE},
- {S_WALKING, N_WALKING},
- {S_RANDOM, N_RANDOM},
- {S_AUDIO, N_AUDIO},
- {S_MIDI, N_MIDI}};
-
- struct MsgPort *rexx_port = NULL;
- extern ULONG g_rexx_fubar = 0L;
- static char port_name[C_NAME_LEN];
-
- static struct MsgPort *register_port(LONG pri );
-
-
- static struct MsgPort *register_port(LONG pri)
- {
- auto int name_index = 0;
- auto struct MsgPort *port = NULL;
-
- Forbid();
- do
- {
- sprintf(port_name, "%s_%d", DEFAULT_NAME, name_index);
- name_index++;
- } while ((FindPort(port_name) != NULL) && (name_index < C_MAX_TRIES));
- port = CreateMsgPort();
- port->mp_Node.ln_Name = port_name;
- port->mp_Node.ln_Pri = pri;
- AddPort(port);
-
- Permit();
- return port;
- }
-
- void shut_rexx(void)
- {
- auto struct RexxMsg *rexx_msg;
-
- if (rexx_port != NULL)
- {
- Forbid();
- }
- while((rexx_msg = (struct RexxMsg *)GetMsg(rexx_port)) != NULL)
- {
- rexx_msg->rm_Result1 = RC_FATAL;
- rexx_msg->rm_Result2 = NULL;
- ReplyMsg( (struct Message *) rexx_msg );
- }
- RemPort(rexx_port);
- DeleteMsgPort(rexx_port);
- Permit();
-
- if( RexxSysBase )
- {
- CloseLibrary( RexxSysBase );
- }
- return;
- }
-
- static int parse_rexx( struct RexxMsg *msg, FORM_TYPE *form,
- struct timeval *duration, int *tempo,
- NOTE_EVENT_TYPE *events, NOTE_LEN_TYPE *note_len,
- int *max_voices, int *scale, int *range,
- int *half_range, int *delay_ticks);
-
- ULONG rexx_mask = 0L;
-
- void init_rexx(void)
- {
- RexxSysBase = OpenLibrary( (UBYTE *) "rexxsyslib.library", 0L );
- if(NULL == RexxSysBase)
- {
- g_rexx_fubar = 1;
- }
- if (!g_rexx_fubar)
- {
- /* Create a port. */
- rexx_port = register_port(1L);
- if(NULL == rexx_port)
- {
- g_rexx_fubar = 1;
- }
- else
- {
- rexx_mask = (1L << rexx_port->mp_SigBit);
- }
- }
- return;
- }
-
- int process_rexx(FORM_TYPE *form,
- struct timeval *duration, int *tempo,
- NOTE_EVENT_TYPE *events, NOTE_LEN_TYPE *note_len,
- int *max_voices, int *scale, int *range,
- int *half_range, int *delay_ticks)
- {
- auto struct RexxMsg *rexx_msg;
- auto int result = 0;
-
- while((rexx_msg = (struct RexxMsg *) GetMsg(rexx_port)) != NULL)
- {
- result = 1;
- result = parse_rexx(rexx_msg, form, duration, tempo, events,
- note_len, max_voices, scale, range,
- half_range, delay_ticks);
- ReplyMsg((struct Message *)rexx_msg);
- }
- return result;
- }
-
- static int parse_rexx(struct RexxMsg *rexx_msg, FORM_TYPE *form,
- struct timeval *duration, int *tempo,
- NOTE_EVENT_TYPE *events, NOTE_LEN_TYPE *note_len,
- int *max_voices, int *scale, int *range,
- int *half_range, int *delay_ticks)
- {
- auto ULONG action_code;
- auto char cmd_str[CMD_STR_LEN],
- *chr,
- break_str[] = BREAK_CHARS;
- auto int token_counter,
- token_counter_inner,
- token_accum,
- token_qty,
- compare,
- temp_num,
- transpose_interval,
- sts,
- voice_num,
- result = 0; /* must be automatic */
- auto TOKEN_TYPE actual_tokens[MAX_TOKEN_QTY];
-
- action_code = rexx_msg->rm_Action & RXCODEMASK;
-
- if(RXCOMM == action_code)
- {
- strcpy(cmd_str, rexx_msg->rm_Args[0]);
- /*
- ** pre-process the command
- */
- for (chr = cmd_str; *chr != '\0'; chr++)
- {
- *chr = toupper(*chr);
- }
- token_qty = 0;
- actual_tokens[token_qty].token_str
- = strtok(cmd_str, break_str);
- if (actual_tokens[0].token_str != NULL)
- {
- do
- {
- token_qty++;
- } while ((NULL !=
- (actual_tokens[token_qty].token_str
- = strtok((char *)NULL, break_str)))
- && (token_qty < MAX_TOKEN_QTY));
- }
- /*
- ** This is a cross product. there is a better way
- ** It doesn't recognique order differences.
- */
- token_accum = 0;
- for ( token_counter = 0; token_counter < C_TOKEN_QTY;
- token_counter++)
- {
- for (token_counter_inner = 0; token_counter_inner <
- token_qty; token_counter_inner++)
- {
- compare = strcmp(tokens[token_counter].token_str,
- actual_tokens[token_counter_inner].token_str);
- if (0 == compare)
- {
- token_accum |= tokens[token_counter].token_num;
- }
- }
- }
- switch (token_accum & M_MENU)
- {
- case N_PROJECT:
- switch (token_accum & M_ITEM)
- {
- case N_PLAY:
- result = C_REXX_PLAY;
- break;
- case N_STOP:
- result = C_REXX_STOP;
- break;
- case N_CONTINUE:
- result = C_REXX_CONTINUE;
- break;
- case N_LOADFORM:
- sts
- = read_file(actual_tokens[2].token_str,
- duration, range,
- scale, max_voices, tempo, form, events,note_len);
- if (!sts)
- {
- if (0 == *tempo)
- {
- *delay_ticks = 0;
- }
- else
- {
- *delay_ticks = 50 / (*tempo);
- }
- *half_range = *range / 2;
- draw_form(duration, form);
- #if 0
- SetWindowTitles(w, actual_tokens[2].token_str,
- (void *) -1L);
- #endif
- result = C_REXX_CHANG_BOTH;
- }
- break;
- case N_SAVEFORM:
- break;
- case N_RECORD:
- switch (token_accum & M_SUBITEM)
- {
- case N_ON:
- break;
- case N_OFF:
- break;
- }
- case N_ERASE:
- break;
- case N_LOAD8SVX:
- break;
- case N_SAVEMIDI:
- break;
- case N_QUIT:
- break;
- }
- break;
- case N_FORM:
- switch (token_accum & M_ITEM)
- {
- case N_MAXVOICES:
- *max_voices
- = strtoul(actual_tokens[2].token_str,
- (char **)NULL, 10L)
- % 20;
- result = C_REXX_CHANG_FORM;
- break;
- case N_REDRAW:
- draw_form(duration, form);
- break;
- case N_PULSE:
- *tempo
- = strtoul(actual_tokens[2].token_str,
- (char **)NULL, 10L) % 25;
- if (*tempo != 0)
- {
- *delay_ticks = 50 / *tempo;
- }
- else
- {
- *delay_ticks = 0;
- }
- result = C_REXX_CHANG_FORM;
- break;
- case N_DURATION:
- duration->tv_secs
- = strtoul(actual_tokens[2].token_str,
- (char **)NULL, 10L);
- duration->tv_micro = 0;
- result = C_REXX_CHANG_FORM;
- break;
- case N_PITCH:
- switch (token_accum & M_SUBITEM)
- {
- case N_MEAN:
- switch (token_accum & M_SUBSUBITEM)
- {
- case N_PERIOD:
- form->frm_s_pitch.prm_d_mean_cycle
- = strtod(actual_tokens[4]
- .token_str, (char **)NULL);
- result = C_REXX_CHANG_FORM;
- break;
- case N_PHASE:
- form->frm_s_pitch.prm_d_mean_phase
- = strtod(actual_tokens[4]
- .token_str, (char **)NULL);
- result = C_REXX_CHANG_FORM;
- break;
- }
- break;
- case N_RANGE:
- switch (token_accum & M_SUBSUBITEM)
- {
- case N_PERIOD:
- form->frm_s_pitch.prm_d_range_cycle
- = strtod(actual_tokens[4]
- .token_str, (char **)NULL);
- result = C_REXX_CHANG_FORM;
- break;
- case N_PHASE:
- form->frm_s_pitch.prm_d_range_phase
- = strtod(actual_tokens[4]
- .token_str, (char **)NULL);
- result = C_REXX_CHANG_FORM;
- break;
- }
- break;
- case N_RANDOMIZE:
- randomize_parameter(&form->frm_s_pitch);
- result = C_REXX_CHANG_FORM;
- break;
- }
- case N_RHYTHM:
- switch (token_accum & M_SUBITEM)
- {
- case N_MEAN:
- switch (token_accum & M_SUBSUBITEM)
- {
- case N_PERIOD:
- form->frm_s_rhythm.prm_d_mean_cycle
- = strtod(actual_tokens[4]
- .token_str, (char **)NULL);
- result = C_REXX_CHANG_FORM;
- break;
- case N_PHASE:
- form->frm_s_rhythm.prm_d_mean_phase
- = strtod(actual_tokens[4]
- .token_str, (char **)NULL);
- result = C_REXX_CHANG_FORM;
- break;
- }
- break;
- case N_RANGE:
- switch (token_accum & M_SUBSUBITEM)
- {
- case N_PERIOD:
- form->frm_s_rhythm
- .prm_d_range_cycle
- = strtod(actual_tokens[4]
- .token_str, (char **)NULL);
- result = C_REXX_CHANG_FORM;
- break;
- case N_PHASE:
- form->frm_s_rhythm
- .prm_d_range_phase
- = strtod(actual_tokens[4]
- .token_str, (char **)NULL);
- result = C_REXX_CHANG_FORM;
- break;
- }
- break;
- case N_RANDOMIZE:
- randomize_parameter(&form->frm_s_rhythm);
- result = C_REXX_CHANG_FORM;
- break;
- }
- case N_DYNAMIC:
- switch (token_accum & M_SUBITEM)
- {
- case N_MEAN:
- switch (token_accum & M_SUBSUBITEM)
- {
- case N_PERIOD:
- form->frm_s_dynamic
- .prm_d_mean_cycle
- = strtod(actual_tokens[4]
- .token_str, (char **)NULL);
- result = C_REXX_CHANG_FORM;
- break;
- case N_PHASE:
- form->frm_s_dynamic
- .prm_d_mean_phase
- = strtod(actual_tokens[4]
- .token_str, (char **)NULL);
- result = C_REXX_CHANG_FORM;
- break;
- }
- break;
- case N_RANGE:
- switch (token_accum & M_SUBSUBITEM)
- {
- case N_PERIOD:
- form->frm_s_dynamic
- .prm_d_range_cycle
- = strtod(actual_tokens[4]
- .token_str, (char **)NULL);
- result = C_REXX_CHANG_FORM;
- break;
- case N_PHASE:
- form->frm_s_dynamic
- .prm_d_range_phase
- = strtod(actual_tokens[4]
- .token_str, (char **)NULL);
- result = C_REXX_CHANG_FORM;
- break;
- }
- break;
- case N_RANDOMIZE:
- randomize_parameter(&form->frm_s_dynamic);
- result = C_REXX_CHANG_FORM;
- break;
- }
- case N_TEXTURE:
- switch (token_accum & M_SUBITEM)
- {
- case N_RANGE:
- switch (token_accum & M_SUBSUBITEM)
- {
- case N_PERIOD:
- form->frm_s_texture
- .prm_d_range_cycle
- = strtod(actual_tokens[4]
- .token_str, (char **)NULL);
- result = C_REXX_CHANG_FORM;
- break;
- case N_PHASE:
- form->frm_s_texture
- .prm_d_range_phase
- = strtod(actual_tokens[4]
- .token_str, (char **)NULL);
- result = C_REXX_CHANG_FORM;
- break;
- }
- break;
- case N_RANDOMIZE:
- randomize_parameter(&form->frm_s_texture);
- result = C_REXX_CHANG_FORM;
- break;
- }
- break;
- case N_NOTELENGTH:
- switch (token_accum & M_SUBITEM)
- {
- case N_MAXIMUM:
- note_len->len_i_max = (int)floor(strtod
- (actual_tokens[3].token_str,
- (char **)NULL) * 1000.0);
- result = C_REXX_CHANG_FORM;
- break;
- case N_MINIMUM:
- note_len->len_i_min = (int)floor(strtod
- (actual_tokens[3].token_str,
- (char **)NULL) * 1000.0);
- result = C_REXX_CHANG_FORM;
- break;
- }
- }
- break;
- case N_VOICE:
- switch (token_accum & M_ITEM)
- {
- case N_CHANNEL:
- voice_num
- = strtoul(actual_tokens[1].token_str,
- (char **)NULL, 10L) - 1;
- if ((voice_num < MAXVOICE) && (voice_num >= 0))
- {
- events[voice_num].nv_i_channel =
- strtoul(actual_tokens[3].token_str,
- (char **)NULL, 10L);
- }
- result = C_REXX_CHANG_VOICE;
- break;
- case N_LOWNOTE:
- voice_num
- = strtoul(actual_tokens[1].token_str,
- (char **)NULL, 10L) - 1;
- if ((voice_num < MAXVOICE) && (voice_num >= 0))
- {
- events[voice_num].nv_i_low_pitch
- = pitch_to_midi(actual_tokens[3].token_str);
- }
- result = C_REXX_CHANG_VOICE;
- break;
- case N_HIGHNOTE:
- voice_num
- = strtoul(actual_tokens[1].token_str,
- (char **)NULL, 10L) - 1;
- if ((voice_num < MAXVOICE) && (voice_num >= 0))
- {
- events[voice_num].nv_i_high_pitch
- = pitch_to_midi(actual_tokens[3].token_str);
- }
- result = C_REXX_CHANG_VOICE;
- break;
- case N_WALKING:
- voice_num
- = strtoul(actual_tokens[1].token_str,
- (char **)NULL, 10L) - 1;
- if ((voice_num < MAXVOICE) && (voice_num >= 0))
- {
- events[voice_num].nv_i_walking = 1;
- }
- result = C_REXX_CHANG_VOICE;
- break;
- case N_RANDOM:
- voice_num
- = strtoul(actual_tokens[1].token_str,
- (char **)NULL, 10L) - 1;
- if ((voice_num < MAXVOICE) && (voice_num >= 0))
- {
- events[voice_num].nv_i_walking = 0;
- }
- result = C_REXX_CHANG_VOICE;
- break;
- case N_AUDIO:
- voice_num
- = strtoul(actual_tokens[1].token_str,
- (char **)NULL, 10L) - 1;
- if ((voice_num < MAXVOICE) && (voice_num >= 0))
- {
- events[voice_num].nv_i_audio = 1;
- }
- result = C_REXX_CHANG_VOICE;
- break;
- case N_MIDI:
- voice_num
- = strtoul(actual_tokens[1].token_str,
- (char **)NULL, 10L) - 1;
- if ((voice_num < MAXVOICE) && (voice_num >= 0))
- {
- events[voice_num].nv_i_audio = 0;
- }
- result = C_REXX_CHANG_VOICE;
- break;
- }
- break;
- default:
- /*
- ** This was an illegally formatted command, so we should
- ** return an error code
- */
- break;
- }
- if (N_SCALE == (token_accum & M_MENU))
- {
- temp_num = ((token_accum & 0XFF0) >> 4);
- if (0 == temp_num)
- {
- transpose_interval
- = strtoul(actual_tokens[1].token_str,
- (char **)NULL, 10L) % 12;
- transpose_scale(transpose_interval, scale, *range);
- }
- else
- {
- if ((temp_num > 0) && (temp_num < 22))
- {
- *range = install_scale(temp_num, scale);
- *half_range = *range / 2;
- }
- }
- /* 0 is tranpose; other is scale */
- }
- rexx_msg->rm_Result1 = RC_OK; /* defined in rexx/errors.h */
- if( rexx_msg->rm_Action & RXFF_RESULT )
- {
- rexx_msg->rm_Result2
- = (LONG)CreateArgstring(REPLY_STR, REPLY_LEN);
- }
- }
- return result;
- }
-